package com.cmc.cloud.cmclink.doc.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cmc.cloud.cmclink.doc.constants.errorconstant.MultiAgentInfoErrorCodeConstants;
import com.cmc.cloud.cmclink.doc.vo.multimodaltransport.multiagentinfo.MultiAgentInfoCreateReqVO;
import com.cmc.cloud.cmclink.doc.vo.multimodaltransport.multiagentinfo.MultiAgentInfoPageReqVO;
import com.cmc.cloud.cmclink.doc.vo.multimodaltransport.multiagentinfo.MultiAgentInfoUpdateReqVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.cmes.framework.common.pojo.PageResult;
import com.cmes.framework.common.exception.util.ServiceExceptionUtil;

import java.util.*;
import com.cmc.cloud.cmclink.doc.service.MultiAgentInfoService;
import com.cmc.cloud.cmclink.doc.entity.MultiAgentInfoDO;
import com.cmc.cloud.cmclink.doc.convert.MultiAgentInfoConvert;
import com.cmc.cloud.cmclink.doc.mapper.MultiAgentInfoMapper;


/**
 * 多式联运代理信息维护 Service 实现类
 *
 * @author 集运管理员
 */
@Service
@Validated
public class MultiAgentInfoServiceImpl implements MultiAgentInfoService {

    @Resource
    private MultiAgentInfoMapper multiAgentInfoMapper;

    @Override
    public void createMultiAgentInfo(MultiAgentInfoCreateReqVO createReqVO) {
        // 插入
        MultiAgentInfoDO multiAgentInfo = MultiAgentInfoConvert.INSTANCE.convert(createReqVO);
        
        // 构建查询条件
        LambdaQueryWrapper<MultiAgentInfoDO> queryWrapper = new LambdaQueryWrapper<MultiAgentInfoDO>()
                .eq(MultiAgentInfoDO::getPolCode, multiAgentInfo.getPolCode())
                .eq(MultiAgentInfoDO::getPodCode, multiAgentInfo.getPodCode())
                .eq(MultiAgentInfoDO::getAgentCode, multiAgentInfo.getAgentCode())
                .eq(MultiAgentInfoDO::getAgentType, multiAgentInfo.getAgentType())
                .eq(MultiAgentInfoDO::getImExType, multiAgentInfo.getImExType())
                .eq(MultiAgentInfoDO::getUsable, multiAgentInfo.getUsable());
        
        if (multiAgentInfoMapper.exists(queryWrapper)) {
            throw ServiceExceptionUtil.exception(MultiAgentInfoErrorCodeConstants.MULTI_AGENT_INFO_EXISTS);
        }
        multiAgentInfoMapper.insert(multiAgentInfo);
    }

    @Override
    public void updateMultiAgentInfo(MultiAgentInfoUpdateReqVO updateReqVO) {
        // 校验存在
        validateMultiAgentInfoExists(updateReqVO.getId());
        // 更新
        MultiAgentInfoDO updateObj = MultiAgentInfoConvert.INSTANCE.convert(updateReqVO);
        
        // 构建查询条件
        LambdaQueryWrapper<MultiAgentInfoDO> queryWrapper = new LambdaQueryWrapper<MultiAgentInfoDO>()
                .eq(MultiAgentInfoDO::getPolCode, updateObj.getPolCode())
                .eq(MultiAgentInfoDO::getPodCode, updateObj.getPodCode())
                .eq(MultiAgentInfoDO::getAgentCode, updateObj.getAgentCode())
                .eq(MultiAgentInfoDO::getAgentType, updateObj.getAgentType())
                .eq(MultiAgentInfoDO::getImExType, updateObj.getImExType())
                .eq(MultiAgentInfoDO::getUsable, updateObj.getUsable())
                .ne(MultiAgentInfoDO::getId, updateObj.getId())
                ;
        
        if (multiAgentInfoMapper.exists(queryWrapper)) {
            throw ServiceExceptionUtil.exception(MultiAgentInfoErrorCodeConstants.MULTI_AGENT_INFO_EXISTS);
        }
        multiAgentInfoMapper.updateById(updateObj);
        if(updateReqVO.getReminderTime()==null){
            multiAgentInfoMapper.update(null, new LambdaUpdateWrapper<MultiAgentInfoDO>()
                    .eq(MultiAgentInfoDO::getId, updateObj.getId())
                    .set(MultiAgentInfoDO::getReminderTime, null)
            );
        }
    }

    @Override
    public void deleteMultiAgentInfo(String ids) {
        Arrays.stream(ids.split(","))
                .map(Long::valueOf)
        .forEach(id -> {
            MultiAgentInfoDO multiAgentInfoDO = multiAgentInfoMapper.selectById(id);
            if (multiAgentInfoDO == null) {
                throw ServiceExceptionUtil.exception(MultiAgentInfoErrorCodeConstants.MULTI_AGENT_INFO_NOT_EXISTS);
            } else if (Boolean.TRUE.equals(multiAgentInfoDO.getUsable())) {
                throw ServiceExceptionUtil.exception(MultiAgentInfoErrorCodeConstants.MULTI_AGENT_INFO_USING);
            }
            // 删除
            multiAgentInfoMapper.deleteById(id);
        });
    }

    private void validateMultiAgentInfoExists(Long id) {
        if (multiAgentInfoMapper.selectById(id) == null) {
            throw ServiceExceptionUtil.exception(MultiAgentInfoErrorCodeConstants.MULTI_AGENT_INFO_NOT_EXISTS);
        }
    }

    @Override
    public MultiAgentInfoDO getMultiAgentInfo(Long id) {
        return multiAgentInfoMapper.selectById(id);
    }

    @Override
    public List<MultiAgentInfoDO> getMultiAgentInfoList(Collection<Long> ids) {
        return multiAgentInfoMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<MultiAgentInfoDO> getMultiAgentInfoPage(MultiAgentInfoPageReqVO reqVO) {
        IPage<MultiAgentInfoDO> page = Page.of(reqVO.getPageNo(), reqVO.getPageSize());
        
        IPage<MultiAgentInfoDO> result = multiAgentInfoMapper.selectPageList(page, reqVO);
        return new PageResult<MultiAgentInfoDO>(result.getRecords(), result.getTotal());
    }
    @Override
    public List<MultiAgentInfoDO> exportExcel(MultiAgentInfoPageReqVO reqVO) {

        return multiAgentInfoMapper.selectPageList(reqVO);
    }
}
